Skip to content

Encode cageids to enable address translations: (arg, cageid) tuple independence from calling cages.#913

Open
stupendoussuperpowers wants to merge 6 commits intofix-targetcageidfrom
encode-argid
Open

Encode cageids to enable address translations: (arg, cageid) tuple independence from calling cages.#913
stupendoussuperpowers wants to merge 6 commits intofix-targetcageidfrom
encode-argid

Conversation

@stupendoussuperpowers
Copy link
Contributor

@stupendoussuperpowers stupendoussuperpowers commented Mar 10, 2026

Building on the discussion here: #896 (comment)

We now allow:

  1. Grates/cages to indicate to threei that the argument they are passing needs translation.
  2. Internally translate arguments on call to make_threei_call.
  3. Ensure support for existing ways to use make_threei_call both in glibc and cages are still supported.

How this works:

  1. The MSB of cageid for each argument in make_threei_call, when set to 1, translate the address in the argument to be host-coded.
  2. Example can be seen in the tests attached, when a grate wants to translate an address, it's indicated by modifying the cageid MSB.
  3. make_threei_call changes the cageid back to a a regular cageid so that existing behaviour is not broken.

Tests added try to pass a grate-local address to the make_threei_call invocation made on behalf of child, and ensure that copy_data_between_cages hasn't regressed:

lind@9a3542c81efe:~/lind-wasm$ sudo lind-boot diff-cage-args_grate.cwasm diff-cage-args.cwasm
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[rawposix|open] path="/tmp/redirected.txt" oflag=0 mode=0
Hello world. FD=3
[Grate|interpose-exec] Handling function ptr: 3 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|interpose-exec] PASS

@JustinCappos
Copy link
Member

JustinCappos commented Mar 10, 2026 via email

@stupendoussuperpowers
Copy link
Contributor Author

My thoughts (as briefly discussed in today's meeting):

In the current model, the grate has no way to do this address translation, it has no information about its global address.

I am not sure whether exposing global address to cages would need some fresh evaluations on memory-safety vectors.

In the current system all address translations are done only in glibc, so this tries to stick with that model.

The change to cageid is only observed in within the make_threei_call function when called from a cage, and the original value is preserved for every other interface. My thinking is: 1. (arg, argcageid) were explicitly designed to be useful for address translations, so this tries to limit the scope of translations to this tuple, and 2. the current MAX_CAGEID (1024) is an i32, but the cageids we pass around are u64 (for compatibility reasons) so this should not affect the maximum range for cageids.

@JustinCappos
Copy link
Member

JustinCappos commented Mar 10, 2026 via email

@stupendoussuperpowers
Copy link
Contributor Author

The solutions you've pointed out all make sense to me and would be implementable albeit some might be more complicated than others given how things are currently written. I've had a bit of a think about this and went back to the original address translation issues/PR to dig deeper.

Just so that we all have a clearer picture of the scope and reason for this PR, I want to ensure we all start with the same set of assumptions about the system. I might be rehashing some old points but it should be helpful to ground the discussion.

First, copying of memory happens in two ways, and the way checks for these happen also differ.

  1. For copy_data_between_cages we have explicit checks to ensure the src/dst addresses provided belong to the cage that was mentioned and that the correct PROT flags are set for the entire range. If they aren't, we return an error.

  2. For rawposix a lot of syscalls do these checks implicitly. (e.g read_syscall). Rawposix assumes the address it was provided is correct and will call libc::read(..., buf_addr,...) to copy something into it. If the address is invalid, depending on the case it will either return -1 or panic. Unlike copy_data, it does not check whether a particular address belongs to a particular cage.

In both the above cases, our Rust codebase (lind, rawposix, threei, etc.) assumes no responsibility for address translations. At most they can detect an error but there is no attempt to "correct" the errors. (More on this later).

Coming to where address translations happen,

Post #469 which was addressing #435, for all regular syscalls addresses are translated to host-space in glibc before it reaches Rust.

Post #582, copy_data does the same.

The only remaining wrinkle left to iron-out in address-conversions is the make_threei_call wrapper, where no translations happen anywhere in the stack. Coming to the solutions you mentioned -

  1. Whether conversion happens inside a grate or in glibc, we need the grate to indicate that a particular arguments needs to be converted.
  • cage/grate is responsible: We don't expose to a cage it's base memory address. (Unsure if this was intentional, the discussion in Move Address Translation from RawPOSIX to libc #435 briefly mentioned some memory-safety issues with this but wasn't clear on it). If it's feasible to expose lind_get_memory_base as a public API, this would by far be the simplest change.
  • glibc is responsible: The grate must pass down information on when to convert an argument. This PR encoded that in the cageid, we could also encode this in the top-bits of the address, or pass down an extra parameter per (arg, cage) tuple.
  1. Every syscall leaving glibc already does address translation, apart from make_threei_call. The checks are only done terminally for both rawposix and copy_data. I am not sure if this addresses the point you made on this. Unclear on what the original meaning was.

  2. Coming back to the error-checking vs error-correcting mentioned earlier. Our Rust codebase is written assuming host-coded addresses. If it receives an address it will runs checks assuming it's host coded, if it fails, it won't retry it with a fresh assumption that it is user-coded.

    If addresses are not "fixed" before reaching Rust, for every possible path we will need to add additional validity-checking logic. First to run these checks assuming things are host-coded, and then to run these checks assuming they are uaddr-coded.

    This is a minor change for copy_data, but would require massive changes to rawposix since we'd need to ditch implicit checks and add these two-pronged checks for every syscall that interacts with a pointer. Implementing that would undo the work of moving address translations to glibc, it would also make the whole exercise of converting addresses in glibc for anything moot since we could just use uaddr for everything, and let rawposix and threei translate them for us on invocation.


Let me know if I misunderstood some of the points you were making.

Tagging @Yaxuan-w and @rennergade to double-check my assumptions about the current state of the codebase.

@rennergade
Copy link
Contributor

The memory base already is in userspace so exposing it in an easier way shouldnt be a problem.

@JustinCappos
Copy link
Member

JustinCappos commented Mar 10, 2026 via email

@stupendoussuperpowers
Copy link
Contributor Author

option 3 is the best for security since we should be doing those checks
anyways. Is there any other reason it would be a problem to do them in 3?

We could run checks at 3 through the various typemap helpers rawposix already uses but are currently no-ops. This should not be that big of a hurdle but might need some new negative unit tests.

But should the scope of these also be to try and convert the address to be host-coded? In which case, address translations are unnecessary at any stage.

One downside which is perhaps why we did it like this is that in theory we
could have a 64 bit grate, etc. and doing the translation once at call time
avoids us needing to do it again and again for different grates.

Yeah I think this point was brought up in the original issue as well.

@Yaxuan-w
Copy link
Member

If I understand the previous discussion correctly, option 3 does not necessarily conflict with the current glibc-based translation approach. It can support both fixed and non-fixed addresses. In practice, it just adds an additional option where grate developers do not need to perform address translation in userspace before invoking the syscall.

Regarding performance, one possible approach could be to add a conditional compile flag. If a user prioritizes performance, we could disable the RawPOSIX-side checks and assume that all addresses have already been fixed before entering RawPOSIX.

From my perspective, based on what I understand about this PR, the work is important for supporting the chroot grate. For the current stage, the lowest-cost and fastest path to getting this working might be to perform the address translation in glibc so that it matches the existing RawPOSIX address checks. At the same time, we could document the design discussion and potential improvements in an issue and revisit it later (for example after the paper submission), when we have more time to refine the design.

As for where exactly the address translation should live if we keep it in glibc, I don't have a strong preference. From the discussion so far, one possible option would also be to let grate developers perform the translation before invoking the syscall. This might also help when testing new RawPOSIX functionality, since it makes the address assumptions explicit.

@stupendoussuperpowers
Copy link
Contributor Author

For now, we can do either of these, and then pick something more robust later:

  1. Expose lind_get_memory_base to userspace, let grates convert their own addresses.
  2. This PR which lets glibc handle it, once indicated.

Both these are low effort changes (a few lines at best), and would enable chroot and similar grates to work properly. Let me know what the best approach is, and I can submit a PR for that.

For the longer run:

We need to decide a strict boundary on who is responsible for address translations, who does what checks, and why. Both the above stated approaches are inconsistent at best (grates must translate/indicate an address for make_threei_call, but mustn't for copy_data), and confusing for grate authors at worst (rawposix will crash on invalid address instead of reporting a proper error). My suggestion is that rawposix must receive only one kind of address, either user or host, having to support both at the same time will lead to a lot of unnecessary address-coercion codepaths.

@JustinCappos
Copy link
Member

JustinCappos commented Mar 11, 2026 via email

@stupendoussuperpowers stupendoussuperpowers marked this pull request as ready for review March 13, 2026 18:13
@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Unified Test Report

grate harness

MetricValue
Total10
Success9
Failures1
Compile Failures0
Runtime Failures1
Timeout Failures0
Missing Pair Failures0

Cases

TestStatusError TypeOutput
concurrent-request/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 2
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

diff-cage-args_grate.cFailureRuntime_Failure
Exception running grate test: 'utf-8' codec can't decode byte 0xff in position 238: invalid start byte
interpose-exec_grate.cSuccess
STDOUT:
[Grate|interpose-exec] Registering exec handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
Exec successful, argv[1]: --execd
[Grate|interpose-exec] PASS

STDERR:

interpose-exit_grate.cSuccess
STDOUT:
[Grate|interpose-exit] Registering exit handler for cage 2 in grate 1 with fn ptr addr: 2
Exiting...

[Grate|interpose-exit] Handling function ptr: 2 from cage: 1
[Grate|interpose-exit] In exit_grate 1 handler for cage: 1
[Grate|interpose-exit] PASS

STDERR:

interpose-fork_grate.cSuccess
STDOUT:
[Grate|interpose-fork] Registering fork handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-fork] Handling function ptr: 2 from cage: 1
[Grate|interpose-fork] In fork_grate 1 handler for cage: 1
[Grate|interpose-fork] PASS

STDERR:

interpose-mmap_grate.cSuccess
STDOUT:
[Grate|interpose-mmap] Registering mmap handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-mmap] Handling function ptr: 2 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 2 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
mmap test: PASS
[Grate|interpose-mmap] PASS

STDERR:

interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage|interpose-register] In cage 2, about to register handler for geteuid
[Grate|interpose-register] Handling function ptr: 3 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Grate|geteuid] Registering geteuid handler for cage 1 in grate 1 with fn ptr addr: 2
[Grate|interpose-register] Handling function ptr: 2 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Cage|interpose-register] PASS: geteuid ret = 10
[Grate|interpose-register] PASS

STDERR:

multi-register_grate.cSuccess
STDOUT:
[Grate|multi-register_grate] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|multi-register_grate] Registering getuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|multi-register_grate] Handling function ptr: 2 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Grate|multi-register_grate] Handling function ptr: 3 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Cage | multi-register] PASS: geteuid=10, getuid=20
[Grate|multi-register] PASS

STDERR:

simple-tests/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

simple-tests/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|geteuid] Handling function ptr: 2 from cage: 1
[Grate|geteuid] In geteuid_grate 1 handler for cage: 1
[Cage | geteuid] PASS: geteuid ret = 10
[Grate|geteuid] PASS

STDERR:

wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases189
Number of Successes188
Number of Failures1
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure1
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
File Tests
chartests.cSuccessNone0.050280s4.261669s
Success
chdir_getcwd.cSuccessNone0.054259s4.298269s
Success
chmod.cSuccessNone0.055827s4.307378s
Success
clock_gettime_highlevel.cSuccessNone0.120894s4.509217s
Success
clock_gettime_simple.cSuccessNone0.044407s4.239271s
Success
cloexec.cSuccessNone0.055414s3.953899s
Success
close.cSuccessNone0.063565s4.305216s
Success
creat_access.cSuccessNone0.053409s4.299342s
Success
doubleclose.cSuccessNone0.046238s3.854068s
Success
dup.cSuccessNone0.046735s4.242100s
Success
dup2.cSuccessNone0.051894s3.894768s
Success
dup3.cSuccessNone0.050368s4.289558s
Success
dupwrite.cSuccessNone0.054450s3.886603s
Success
etc_conf.cSuccessNone0.048206s4.270202s
Success
fchdir.cSuccessNone0.057587s4.318686s
Success
fchmod.cSuccessNone0.057936s4.276204s
Success
fcntl.cSuccessNone0.052899s4.256564s
Success
fdatasync.cSuccessNone0.052350s4.257798s
Success
filetest.cSuccessNone0.052232s3.877769s
Success
filetest1000.cSuccessNone0.062532s3.901877s
Success
flock.cSuccessNone0.061756s4.342343s
Success
fstat.cSuccessNone0.055395s4.276943s
Success
fstatfs.cSuccessNone0.047321s4.259563s
Success
fsync.cSuccessNone0.051944s4.263974s
Success
ftruncate.cSuccessNone0.059721s4.324947s
Success
getcwd.cSuccessNone0.048773s4.291030s
Success
getrandom.cSuccessNone0.053324s4.270538s
Success
ioctl.cSuccessNone0.057739s4.273353s
Success
link.cSuccessNone0.056653s4.289130s
Success
locale_test.cSuccessNone0.067639s6.105846s
Success
lseek.cSuccessNone0.057711s4.319320s
Success
mkdir_rmdir.cSuccessNone0.054587s4.284884s
Success
mkfifo_test.cSuccessNone0.059283s4.350507s
Success
mknod.cSuccessNone0.052175s4.299837s
Success
nocancel_io.cSuccessNone0.056979s5.476573s
Success
open.cSuccessNone0.047789s4.247283s
Success
path_conversion_safety.cSuccessNone0.057948s4.278459s
Success
pread_pwrite.cSuccessNone0.051595s4.270905s
Success
printf.cSuccessNone0.044499s3.859076s
Success
read.cSuccessNone0.053283s4.251925s
Success
readbytes.cSuccessNone0.051105s3.840441s
Success
readlink.cSuccessNone0.053913s4.291847s
Success
readlinkat.cSuccessNone0.054815s4.254434s
Success
readv_writev_test.cSuccessNone0.055151s4.272148s
Success
rename.cSuccessNone0.055533s4.275503s
Success
sc-writev.cSuccessNone0.051395s4.247181s
Success
stat.cSuccessNone0.054963s4.269826s
Success
statfs.cSuccessNone0.048188s4.257496s
Success
sync_file_range.cSuccessNone0.051811s4.273524s
Success
truncate.cSuccessNone0.054335s4.285964s
Success
unlink.cSuccessNone0.055547s4.307766s
Success
unlinkat.cSuccessNone0.055269s4.318104s
Success
write.cSuccessNone0.046830s3.866538s
Success
writeloop.cSuccessNone0.056102s3.877213s
Success
writepartial.cSuccessNone0.054008s3.879677s
Success
writev.cSuccessNone0.054671s4.257050s
Success
Math Tests
math_link_smoke.cSuccessNone0.057048s3.948240s
Success
math_tests.cSuccessNone0.062618s4.051975s
Success
Memory Tests
brk.cSuccessNone0.054818s4.276876s
Success
fork_large_memory.cSuccessNone0.087129s4.426056s
Success
malloc.cSuccessNone0.048976s3.864938s
Success
malloc_large.cSuccessNone0.050078s4.269262s
Success
memcpy.cSuccessNone0.048535s3.860749s
Success
memory_error_test.cSuccessNone0.056022s4.246789s
Success
mmap.cSuccessNone0.045396s4.265612s
Success
mmap_aligned.cSuccessNone0.047468s4.251908s
Success
mmap_complicated.cSuccessNone0.053908s4.353164s
Success
mmap_file.cSuccessNone0.053246s4.295642s
Success
mmap_shared.cSuccessNone0.053392s4.290427s
Success
mmaptest.cSuccessNone0.049219s4.248791s
Success
mprotect.cSuccessNone0.047358s4.291602s
Success
mprotect_boundary.cSuccessNone0.047844s4.266136s
Success
mprotect_end_region.cSuccessNone0.046781s4.286408s
Success
mprotect_middle_region.cSuccessNone0.046551s4.256402s
Success
mprotect_multiple_times.cSuccessNone0.047703s4.266872s
Success
mprotect_same_value.cSuccessNone0.047438s4.256090s
Success
mprotect_spanning_regions.cSuccessNone0.047596s4.263787s
Success
sbrk.cSuccessNone0.048300s4.255199s
Success
segfault.cSuccessNone0.056165s4.327260s
Success
shm.cSuccessNone0.053291s4.325829s
Success
shmtest.cSuccessNone0.048257s4.296483s
Success
tcache_test.cFailureUnknown_Failure0.057342s4.437012s
tcache reuse: yes
failed to run main module

Caused by:
0: failed to invoke command default
1: memory fault at wasm address 0xfffbcba4 in linear memory of size 0x100000000
2: wasm trap: out of bounds memory access
Error: memory fault at wasm address 0xfff9d50c in linear memory of size 0x100000000

Caused by:
wasm trap: out of bounds memory access

thread_malloc_sequential.cSuccessNone0.055218s4.437006s
Success
vtable.cSuccessNone0.061401s3.898095s
Success
Networking Tests
dns_resolve_test.cSuccessNone0.053918s5.985868s
Success
dnstest.cSuccessNone0.054278s4.272791s
Success
epoll_edge_triggered.cSuccessNone0.211780s4.497272s
Success
epollcreate1.cSuccessNone0.055462s4.279549s
Success
error_handling_net.cSuccessNone0.063853s4.366398s
Success
getaddrinfo_test.cSuccessNone0.057722s6.002686s
Success
gethostname.cSuccessNone0.046979s3.862313s
Success
getifaddrs.cSuccessNone0.056315s4.343962s
Success
getsockname.cSuccessNone0.055802s4.293082s
Success
getsockopt.cSuccessNone0.057394s4.294355s
Success
ipv6_basic.cSuccessNone0.059109s4.316709s
Success
makepipe.cSuccessNone0.046677s3.878976s
Success
nonblocking_eagain.cSuccessNone0.058984s4.329667s
Success
pipe.cSuccessNone0.055926s4.296875s
Success
pipe2.cSuccessNone0.056664s4.262287s
Success
pipeinput.cSuccessNone0.057198s4.330332s
Success
pipeinput2.cSuccessNone0.057623s4.323779s
Success
pipeonestring.cSuccessNone0.058074s4.309990s
Success
pipepong.cSuccessNone0.056886s4.342838s
Success
pipewrite.cSuccessNone0.050189s4.259821s
Success
poll.cSuccessNone0.054163s4.264365s
Success
recvfrom-sendto.cSuccessNone0.055718s4.289836s
Success
sendmsg_recvmsg_test.cSuccessNone0.055450s4.382281s
Success
serverclient.cSuccessNone0.054862s3.917477s
Success
shutdown.cSuccessNone0.056367s3.917319s
Success
shutdown_fork.cSuccessNone0.054947s4.325805s
Success
simple-select.cSuccessNone0.056537s4.315691s
Success
simple_epoll.cSuccessNone0.054833s4.261348s
Success
socket.cSuccessNone0.053688s3.865768s
Success
socket_cloexec.cSuccessNone0.053202s4.247539s
Success
socket_options_advanced.cSuccessNone0.059593s4.304410s
Success
socketepoll.cSuccessNone0.053831s3.880753s
Success
socketpair.cSuccessNone0.052672s4.317060s
Success
socketselect.cSuccessNone0.053446s4.273252s
Success
tcp_connect_single.cSuccessNone0.054500s4.296733s
Success
udp_send_recv.cSuccessNone0.163604s4.451331s
Success
uds-getsockname.cSuccessNone0.055425s4.295609s
Success
uds-nb-select.cSuccessNone2.065407s6.504515s
Success
uds-serverclient.cSuccessNone0.058805s4.397464s
Success
uds-socketselect.cSuccessNone0.055667s3.889671s
Success
writev_socket.cSuccessNone0.057334s4.269561s
Success
Process Tests
barrier_test.cSuccessNone0.053184s4.437953s
Success
chain_thread.cSuccessNone1.055336s5.439333s
Success
ctor_syscall_test.cSuccessNone0.045022s4.277104s
Success
cxa_atexit_test.cSuccessNone0.050570s3.869717s
Success
exit.cSuccessNone0.051386s3.876884s
Success
exit_failure.cSuccessNone0.053408s3.927179s
Success
flockfile_test.cSuccessNone0.054412s4.450711s
Success
fork2malloc.cSuccessNone0.056019s4.348379s
Success
fork_select.cSuccessNone0.053418s4.326265s
Success
fork_simple.cSuccessNone0.052142s4.308859s
Success
fork_syscall.cSuccessNone0.060687s4.349358s
Success
fork_tls_ctype.cSuccessNone0.056933s4.330325s
Success
forkandopen.cSuccessNone0.055166s4.294780s
Success
forkdup.cSuccessNone0.056788s3.948789s
Success
forkexecuid.cSuccessNone0.052732s4.341745s
Success
forkexecv-arg.cSuccessNone0.052797s4.330382s
Success
forkexecv.cSuccessNone0.051582s4.311200s
Success
forkfiles.cSuccessNone0.055186s4.306078s
Success
forkmalloc.cSuccessNone0.067112s4.348805s
Success
forknodup.cSuccessNone0.056099s4.322152s
Success
function-ptr.cSuccessNone0.050391s4.263025s
Success
getegid_syscall.cSuccessNone0.056030s4.339933s
Success
getgid_syscall.cSuccessNone0.055299s4.345326s
Success
getpid.cSuccessNone0.047730s4.272456s
Success
getpid_syscall.cSuccessNone0.056732s4.382873s
Success
getppid.cSuccessNone0.056886s4.324776s
Success
getppid_syscall.cSuccessNone0.059071s4.349974s
Success
getuid.cSuccessNone0.055370s4.252904s
Success
getuid_syscall.cSuccessNone0.052952s4.329155s
Success
hello-arg.cSuccessNone0.044723s3.875063s
Success
hello.cSuccessNone0.044976s3.870044s
Success
longjmp.cSuccessNone0.045981s3.869018s
Success
mutex.cSuccessNone2.059740s6.558744s
Success
printf_deadlock_smoke.cSuccessNone0.063428s4.613300s
Success
printf_thread_test.cSuccessNone0.052790s4.457714s
Success
sem_forks.cSuccessNone0.057398s4.350836s
Success
setsid.cSuccessNone0.047355s3.874698s
Success
template.cSuccessNone0.055100s4.312511s
Success
test_exec_nofork.cSuccessNone0.053026s4.286905s
Success
test_unlink_open_file.cSuccessNone0.049097s3.872995s
Success
thread-test.cSuccessNone0.050695s4.406966s
Success
thread.cSuccessNone0.049390s4.424255s
Success
thread_cageid_race.cSuccessNone0.050510s4.426192s
Success
tls_test.cSuccessNone0.052675s4.443751s
Success
uname.cSuccessNone0.047692s4.266432s
Success
wait.cSuccessNone2.052186s5.918511s
Success
waitpid_anychild.cSuccessNone0.054019s4.300249s
Success
waitpid_syscall.cSuccessNone1.056915s5.399600s
Success
waitpid_wnohang.cSuccessNone0.055622s3.904125s
Success
Signal Tests
alarm.cSuccessNone7.053874s10.914539s
Success
eintr_fork_signal.cSuccessNone1.057161s5.339063s
Success
setitimer.cSuccessNone7.053802s10.904379s
Success
sigalrm.cSuccessNone2.055179s5.913219s
Success
sigchld.cSuccessNone1.056504s4.954238s
Success
signal-fork.cSuccessNone4.056252s7.967600s
Success
signal-simple.cSuccessNone0.055394s3.917451s
Success
signal_SIGCHLD.cSuccessNone0.053873s4.339271s
Success
signal_fork.cSuccessNone0.051916s4.335692s
Success
signal_int_ignored.cSuccessNone2.055009s6.350750s
Success
signal_procmask.cSuccessNone0.049277s4.305976s
Success
signal_recursive.cSuccessNone0.049591s3.908753s
Success
signal_sa_mask.cSuccessNone0.049473s3.911066s
Success
sigpipe.cSuccessNone1.057285s5.392515s
Success
sigprocmask.cSuccessNone1.054322s4.931165s
Success
Fail Tests

Summary

MetricCount
Total Test Cases3
Number of Successes3
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Memory Tests
mmap-negative1.cSuccessNone0.117720s4.837162s
Success
mmap-negative2.cSuccessNone0.143208s4.422101s
Success
Signal Tests
signal_resethand.cSuccessNone1.054754s3.948811s
Success

@github-actions
Copy link
Contributor

End-to-End Test Report

Test Preview

Unified Test Report

grate harness

MetricValue
Total10
Success10
Failures0
Compile Failures0
Runtime Failures0
Timeout Failures0
Missing Pair Failures0

Cases

TestStatusError TypeOutput
concurrent-request/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 2
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

diff-cage-args_grate.cSuccess
STDOUT:
[Grate|diff-cage-args] Handling function ptr: 2 from cage: 1
[Grate|diff-cage-args] In open_grate 1 handler for cage: 1
Hello world. FD=-1
[Grate|diff-cage-args] Handling function ptr: 3 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|diff-cage-args] PASS

STDERR:

interpose-exec_grate.cSuccess
STDOUT:
[Grate|interpose-exec] Registering exec handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[Grate|interpose-exec] Handling function ptr: 2 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
Exec successful, argv[1]: --execd
[Grate|interpose-exec] PASS

STDERR:

interpose-exit_grate.cSuccess
STDOUT:
[Grate|interpose-exit] Registering exit handler for cage 2 in grate 1 with fn ptr addr: 2
Exiting...

[Grate|interpose-exit] Handling function ptr: 2 from cage: 1
[Grate|interpose-exit] In exit_grate 1 handler for cage: 1
[Grate|interpose-exit] PASS

STDERR:

interpose-fork_grate.cSuccess
STDOUT:
[Grate|interpose-fork] Registering fork handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-fork] Handling function ptr: 2 from cage: 1
[Grate|interpose-fork] In fork_grate 1 handler for cage: 1
[Grate|interpose-fork] PASS

STDERR:

interpose-mmap_grate.cSuccess
STDOUT:
[Grate|interpose-mmap] Registering mmap handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|interpose-mmap] Handling function ptr: 2 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 2 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
mmap test: PASS
[Grate|interpose-mmap] PASS

STDERR:

interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage|interpose-register] In cage 2, about to register handler for geteuid
[Grate|interpose-register] Handling function ptr: 3 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Grate|geteuid] Registering geteuid handler for cage 1 in grate 1 with fn ptr addr: 2
[Grate|interpose-register] Handling function ptr: 2 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Cage|interpose-register] PASS: geteuid ret = 10
[Grate|interpose-register] PASS

STDERR:

multi-register_grate.cSuccess
STDOUT:
[Grate|multi-register_grate] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|multi-register_grate] Registering getuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|multi-register_grate] Handling function ptr: 2 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Grate|multi-register_grate] Handling function ptr: 3 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Cage | multi-register] PASS: geteuid=10, getuid=20
[Grate|multi-register] PASS

STDERR:

simple-tests/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

simple-tests/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 2
[Grate|geteuid] Handling function ptr: 2 from cage: 1
[Grate|geteuid] In geteuid_grate 1 handler for cage: 1
[Cage | geteuid] PASS: geteuid ret = 10
[Grate|geteuid] PASS

STDERR:

wasm harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases189
Number of Successes189
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
File Tests
chartests.cSuccessNone0.051043s4.289023s
Success
chdir_getcwd.cSuccessNone0.050381s4.298404s
Success
chmod.cSuccessNone0.056264s4.302681s
Success
clock_gettime_highlevel.cSuccessNone0.121914s4.491387s
Success
clock_gettime_simple.cSuccessNone0.045761s4.235179s
Success
cloexec.cSuccessNone0.056029s3.941040s
Success
close.cSuccessNone0.063571s4.326424s
Success
creat_access.cSuccessNone0.055270s4.349153s
Success
doubleclose.cSuccessNone0.045954s3.873349s
Success
dup.cSuccessNone0.046907s4.277390s
Success
dup2.cSuccessNone0.053035s3.907138s
Success
dup3.cSuccessNone0.050737s4.295391s
Success
dupwrite.cSuccessNone0.056081s3.928536s
Success
etc_conf.cSuccessNone0.048849s4.305358s
Success
fchdir.cSuccessNone0.056750s4.338299s
Success
fchmod.cSuccessNone0.059317s4.308862s
Success
fcntl.cSuccessNone0.053898s4.330656s
Success
fdatasync.cSuccessNone0.052785s4.263799s
Success
filetest.cSuccessNone0.053951s3.920304s
Success
filetest1000.cSuccessNone0.063992s3.978952s
Success
flock.cSuccessNone0.062162s4.422526s
Success
fstat.cSuccessNone0.056262s4.308970s
Success
fstatfs.cSuccessNone0.049808s4.311481s
Success
fsync.cSuccessNone0.055279s4.319691s
Success
ftruncate.cSuccessNone0.058397s4.398073s
Success
getcwd.cSuccessNone0.051367s4.308789s
Success
getrandom.cSuccessNone0.054226s4.268447s
Success
ioctl.cSuccessNone0.060231s4.326568s
Success
link.cSuccessNone0.057513s4.343853s
Success
locale_test.cSuccessNone0.067463s6.062783s
Success
lseek.cSuccessNone0.058404s4.334243s
Success
mkdir_rmdir.cSuccessNone0.054299s4.287992s
Success
mkfifo_test.cSuccessNone0.059849s4.356580s
Success
mknod.cSuccessNone0.052389s4.284831s
Success
nocancel_io.cSuccessNone0.059685s5.594282s
Success
open.cSuccessNone0.050267s4.325393s
Success
path_conversion_safety.cSuccessNone0.060109s4.301327s
Success
pread_pwrite.cSuccessNone0.050195s4.257937s
Success
printf.cSuccessNone0.047228s3.899367s
Success
read.cSuccessNone0.055289s4.324639s
Success
readbytes.cSuccessNone0.050955s3.877924s
Success
readlink.cSuccessNone0.054991s4.374086s
Success
readlinkat.cSuccessNone0.059241s4.347720s
Success
readv_writev_test.cSuccessNone0.055892s4.299712s
Success
rename.cSuccessNone0.055465s4.316350s
Success
sc-writev.cSuccessNone0.051069s4.286811s
Success
stat.cSuccessNone0.057536s4.301614s
Success
statfs.cSuccessNone0.048955s4.287657s
Success
sync_file_range.cSuccessNone0.052849s4.307827s
Success
truncate.cSuccessNone0.055292s4.333618s
Success
unlink.cSuccessNone0.057484s4.415194s
Success
unlinkat.cSuccessNone0.057866s4.362641s
Success
write.cSuccessNone0.049952s3.893219s
Success
writeloop.cSuccessNone0.058025s3.909896s
Success
writepartial.cSuccessNone0.055005s3.971332s
Success
writev.cSuccessNone0.054947s4.279355s
Success
Math Tests
math_link_smoke.cSuccessNone0.058486s4.009624s
Success
math_tests.cSuccessNone0.069595s4.120215s
Success
Memory Tests
brk.cSuccessNone0.055598s4.266282s
Success
fork_large_memory.cSuccessNone0.086251s4.465203s
Success
malloc.cSuccessNone0.049930s3.864391s
Success
malloc_large.cSuccessNone0.053030s4.363048s
Success
memcpy.cSuccessNone0.048594s3.880755s
Success
memory_error_test.cSuccessNone0.055310s4.326054s
Success
mmap.cSuccessNone0.046550s4.289529s
Success
mmap_aligned.cSuccessNone0.048677s4.269373s
Success
mmap_complicated.cSuccessNone0.054626s4.394233s
Success
mmap_file.cSuccessNone0.054368s4.291162s
Success
mmap_shared.cSuccessNone0.053141s4.303742s
Success
mmaptest.cSuccessNone0.052223s4.385193s
Success
mprotect.cSuccessNone0.048189s4.280807s
Success
mprotect_boundary.cSuccessNone0.048554s4.336975s
Success
mprotect_end_region.cSuccessNone0.049681s4.417355s
Success
mprotect_middle_region.cSuccessNone0.050358s4.306867s
Success
mprotect_multiple_times.cSuccessNone0.049027s4.306982s
Success
mprotect_same_value.cSuccessNone0.046797s4.246990s
Success
mprotect_spanning_regions.cSuccessNone0.049244s4.344822s
Success
sbrk.cSuccessNone0.050143s4.348036s
Success
segfault.cSuccessNone0.055699s4.312676s
Success
shm.cSuccessNone0.053566s4.339762s
Success
shmtest.cSuccessNone0.049422s4.309016s
Success
tcache_test.cSuccessNone0.060809s4.446078s
Success
thread_malloc_sequential.cSuccessNone0.057137s4.563456s
Success
vtable.cSuccessNone0.061361s3.891158s
Success
Networking Tests
dns_resolve_test.cSuccessNone0.056690s6.393604s
Success
dnstest.cSuccessNone0.059504s4.423030s
Success
epoll_edge_triggered.cSuccessNone0.216429s4.582465s
Success
epollcreate1.cSuccessNone0.058548s4.476220s
Success
error_handling_net.cSuccessNone0.067225s4.603902s
Success
getaddrinfo_test.cSuccessNone0.064375s6.314053s
Success
gethostname.cSuccessNone0.050457s4.001558s
Success
getifaddrs.cSuccessNone0.059245s4.464290s
Success
getsockname.cSuccessNone0.058264s4.394187s
Success
getsockopt.cSuccessNone0.060045s4.413973s
Success
ipv6_basic.cSuccessNone0.061620s4.458047s
Success
makepipe.cSuccessNone0.050295s3.990824s
Success
nonblocking_eagain.cSuccessNone0.063182s4.472112s
Success
pipe.cSuccessNone0.060391s4.488597s
Success
pipe2.cSuccessNone0.058346s4.372199s
Success
pipeinput.cSuccessNone0.059864s4.463930s
Success
pipeinput2.cSuccessNone0.060013s4.455057s
Success
pipeonestring.cSuccessNone0.060987s4.463727s
Success
pipepong.cSuccessNone0.058550s4.493870s
Success
pipewrite.cSuccessNone0.054778s4.497100s
Success
poll.cSuccessNone0.057711s4.384981s
Success
recvfrom-sendto.cSuccessNone0.059382s4.405714s
Success
sendmsg_recvmsg_test.cSuccessNone0.058162s4.445261s
Success
serverclient.cSuccessNone0.057969s4.067155s
Success
shutdown.cSuccessNone0.061046s4.040968s
Success
shutdown_fork.cSuccessNone0.059739s4.456071s
Success
simple-select.cSuccessNone0.059951s4.442910s
Success
simple_epoll.cSuccessNone0.056272s4.405770s
Success
socket.cSuccessNone0.058292s3.992977s
Success
socket_cloexec.cSuccessNone0.056829s4.341785s
Success
socket_options_advanced.cSuccessNone0.064013s4.427218s
Success
socketepoll.cSuccessNone0.057799s3.982609s
Success
socketpair.cSuccessNone0.058518s4.549073s
Success
socketselect.cSuccessNone0.056123s4.425939s
Success
tcp_connect_single.cSuccessNone0.058766s4.421965s
Success
udp_send_recv.cSuccessNone0.165545s4.607094s
Success
uds-getsockname.cSuccessNone0.058502s4.431731s
Success
uds-nb-select.cSuccessNone2.066827s6.706609s
Success
uds-serverclient.cSuccessNone0.061533s4.492290s
Success
uds-socketselect.cSuccessNone0.059166s3.996097s
Success
writev_socket.cSuccessNone0.061401s4.479021s
Success
Process Tests
barrier_test.cSuccessNone0.053866s4.433853s
Success
chain_thread.cSuccessNone1.055707s5.474192s
Success
ctor_syscall_test.cSuccessNone0.044785s4.262248s
Success
cxa_atexit_test.cSuccessNone0.050424s3.880382s
Success
exit.cSuccessNone0.052501s3.874073s
Success
exit_failure.cSuccessNone0.054006s3.963450s
Success
flockfile_test.cSuccessNone0.055060s4.447487s
Success
fork2malloc.cSuccessNone0.055131s4.305846s
Success
fork_select.cSuccessNone0.053663s4.364676s
Success
fork_simple.cSuccessNone0.051646s4.313912s
Success
fork_syscall.cSuccessNone0.058923s4.362006s
Success
fork_tls_ctype.cSuccessNone0.056805s4.334475s
Success
forkandopen.cSuccessNone0.055592s4.323602s
Success
forkdup.cSuccessNone0.057117s3.956794s
Success
forkexecuid.cSuccessNone0.053233s4.330326s
Success
forkexecv-arg.cSuccessNone0.054039s4.312353s
Success
forkexecv.cSuccessNone0.053983s4.331673s
Success
forkfiles.cSuccessNone0.056592s4.319315s
Success
forkmalloc.cSuccessNone0.085964s4.356248s
Success
forknodup.cSuccessNone0.061189s4.383122s
Success
function-ptr.cSuccessNone0.051267s4.266739s
Success
getegid_syscall.cSuccessNone0.054717s4.340626s
Success
getgid_syscall.cSuccessNone0.056440s4.341798s
Success
getpid.cSuccessNone0.047977s4.272742s
Success
getpid_syscall.cSuccessNone0.060087s4.548085s
Success
getppid.cSuccessNone0.055162s4.315459s
Success
getppid_syscall.cSuccessNone0.058015s4.357295s
Success
getuid.cSuccessNone0.054977s4.248444s
Success
getuid_syscall.cSuccessNone0.053340s4.355155s
Success
hello-arg.cSuccessNone0.045102s3.920326s
Success
hello.cSuccessNone0.045034s3.874785s
Success
longjmp.cSuccessNone0.047139s3.973939s
Success
mutex.cSuccessNone2.061418s6.542383s
Success
printf_deadlock_smoke.cSuccessNone0.063820s4.647775s
Success
printf_thread_test.cSuccessNone0.053999s4.461054s
Success
sem_forks.cSuccessNone0.057980s4.358052s
Success
setsid.cSuccessNone0.050910s3.891343s
Success
template.cSuccessNone0.056737s4.310757s
Success
test_exec_nofork.cSuccessNone0.055133s4.278645s
Success
test_unlink_open_file.cSuccessNone0.050034s3.849864s
Success
thread-test.cSuccessNone0.049023s4.434647s
Success
thread.cSuccessNone0.049018s4.426511s
Success
thread_cageid_race.cSuccessNone0.050549s4.399614s
Success
tls_test.cSuccessNone0.052484s4.414759s
Success
uname.cSuccessNone0.047827s4.219547s
Success
wait.cSuccessNone2.051614s5.920062s
Success
waitpid_anychild.cSuccessNone0.055023s4.306420s
Success
waitpid_syscall.cSuccessNone1.055742s5.324272s
Success
waitpid_wnohang.cSuccessNone0.055666s3.912124s
Success
Signal Tests
alarm.cSuccessNone7.057421s11.104038s
Success
eintr_fork_signal.cSuccessNone1.059888s5.501115s
Success
setitimer.cSuccessNone7.057195s11.071914s
Success
sigalrm.cSuccessNone2.058867s6.044000s
Success
sigchld.cSuccessNone1.059089s5.096774s
Success
signal-fork.cSuccessNone4.060049s8.071516s
Success
signal-simple.cSuccessNone0.058301s4.023050s
Success
signal_SIGCHLD.cSuccessNone0.057123s4.471341s
Success
signal_fork.cSuccessNone0.055199s4.467004s
Success
signal_int_ignored.cSuccessNone2.057876s6.495220s
Success
signal_procmask.cSuccessNone0.052275s4.428118s
Success
signal_recursive.cSuccessNone0.051990s3.993680s
Success
signal_sa_mask.cSuccessNone0.051185s4.014407s
Success
sigpipe.cSuccessNone1.058919s5.503479s
Success
sigprocmask.cSuccessNone1.058281s5.040603s
Success
Fail Tests

Summary

MetricCount
Total Test Cases3
Number of Successes3
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Memory Tests
mmap-negative1.cSuccessNone0.130613s4.587654s
Success
mmap-negative2.cSuccessNone0.131466s4.536326s
Success
Signal Tests
signal_resethand.cSuccessNone1.057148s4.068909s
Success

Copy link
Member

@Yaxuan-w Yaxuan-w left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved to unblock current grate implementation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants